﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using estudent.Models;

namespace estudent.Controllers
{
    public class PrijavaIzpitRefController : Controller
    {
        estudentEnt db = new estudentEnt();

        //
        // GET: /PrijavaIzpitRef/

        public ActionResult Index()
        {
            ViewData["namen"] = "PrijavaIzpitRef";
            return View("IskanjeStudent");
        }

        public ActionResult Prijavi(string id)
        {
            string vpisna = id;//od studenta vpisna

            //vpisi od studenta
            var vpisi = db.Vpisis.Where(v => v.username == vpisna).OrderBy(v => v.letoVpisa);
            //odstranit prvic v letnik vpis, ce je ponavljal pol tudi ta letnik
            List<Vpisi> listVpisi = vpisi.ToList<Vpisi>();
            if (vpisi.Any(v => v.idVrstaVpisa == "V2"))
            {
                var vpisiV2 = vpisi.Where(v => v.idVrstaVpisa == "V2");
                foreach (var vpis in vpisiV2)
                {
                    Vpisi prvicVpis = vpisi.FirstOrDefault(v => v.idLetnikStudija == vpis.idLetnikStudija && v.sSmer == vpis.sSmer);
                    listVpisi.Remove(prvicVpis);
                }
            }
            ViewData["vpisna"] = id;
            ViewData["vpisi"] = listVpisi;
            return View();
        }

        public string PoisciPredmete(FormCollection form)
        {
            string result = "";

            decimal idVpis = Decimal.Parse(form["vpisi"]);

            IEnumerable<sPredmeti> predmeti = db.Vpisis.FirstOrDefault(v => v.idVpisa == idVpis).sPredmetis;

            string vpisna = form["vpisna"];

            //ze opravljeni
            IEnumerable<sPredmeti> opravljeni = from p in db.PrijaveNaIzpits
                                                where p.Vpisi.username == vpisna && (p.koncnaOcena > 6 || p.koncnaOcenaVaj > 6)
                                                select p.IzpitniRoki.Poucuje.sPredmeti;

            predmeti = predmeti.Except(opravljeni);


            result = "<option value='prazen'>Izberi predmet</option>";
            foreach (var pred in predmeti)
            {
                result += "<option value='" + pred.sPredmeta + "'>" + pred.imePredmeta + " - " + pred.sPredmeta + "</option>";
            }

            return result;
        }

        public string PoisciRoke(FormCollection form)
        {
            string result = "";

            decimal idPred = Decimal.Parse(form["predmeti"]);
            DateTime zdejle = DateTime.Now;
            IEnumerable<IzpitniRoki> roki = db.IzpitniRokis.Where(r => r.Poucuje.sPredmeta == idPred);
            result = "<option value='prazen'>Izberi rok</option>";
            foreach (var rok in roki)
            {
                result += "<option value='" + rok.idPoucuje + "," + rok.datumRoka.ToBinary() + "'>" + String.Format("{0:dd/MM/yyyy}", rok.datumRoka) + " (" + rok.Poucuje.SProfesorji1.imeProfesor + " " + rok.Poucuje.SProfesorji1.priimekProfesor + ((rok.Poucuje.SProfesorji2 != null) ? ", " + rok.Poucuje.SProfesorji2.imeProfesor + " " + rok.Poucuje.SProfesorji2.priimekProfesor : "") + ((rok.Poucuje.SProfesorji != null) ? ", " + rok.Poucuje.SProfesorji.imeProfesor + " " + rok.Poucuje.SProfesorji.priimekProfesor : "") + ")</option>";
            }

            return result;
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string Prijava(FormCollection form)
        {
            Session["tempc"] = form["predmeti"];

            string[] id = form["roki"].Split(new char[] { ',' });
            decimal idPouc = Decimal.Parse(id[0]);
            DateTime datum = DateTime.FromBinary(long.Parse(id[1]));

            decimal idVpis = Decimal.Parse(form["vpisi"]);

            bool placat = false;





                //preverimo ali je tri dni pred rokom prijava
                DateTime dons = DateTime.Now;

                int trenutnoStudLeto = (dons.Month >= 10) ? dons.Year : (dons.Year - 1);
                string opozorilo = "";
                if (datum < (dons.AddDays(3)))
                {
                    opozorilo += "Prijava vsaj 3 dni pred izpitnim rokom.\n";
                }

                //ali je vsaj 14 dni od zadnjega polaganja
                PrijaveNaIzpit prejsni = db.PrijaveNaIzpits.OrderByDescending(p => p.datumRoka).FirstOrDefault(p => p.idPoucuje == idPouc && p.idVpisa == idVpis);
                DateTime meja = new DateTime();
                if (prejsni != null)
                    meja = prejsni.datumRoka.AddDays(13);
                if (prejsni != null && meja > datum)
                {
                    opozorilo += "Zadnja prijava za ta izpit pred manj kot 14 dnevi.\n";
                }

                //max 3 stevilo prijav v tekocem studijskem letu
                DateTime zacStudLeta = new DateTime(trenutnoStudLeto, 10, 1);
                DateTime konStudLeta = new DateTime(trenutnoStudLeto + 1, 9, 30);
                int steviloPrijavTek = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa == idVpis && (p.datumRoka >= zacStudLeta && p.datumRoka <= konStudLeta)).Count();
                if (steviloPrijavTek >= 3)
                {
                    opozorilo += "V letošnjem študijskem letu študent že 3x prijavljen na ta izpit.\n";
                }

                //max 6 stevilo prijav v celotnem obdobju
                string vpisna = form["vpisna"];
                int steviloPrijav = 0;
                steviloPrijav = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa == idVpis).Count();
                if (steviloPrijav >= 6)
                {
                    opozorilo += "Študent je že bil 6x prijavljen na ta izpit.\n";
                }

                //preveri prijavo na ze opravljen izpit
                PrijaveNaIzpit opravljen = db.PrijaveNaIzpits.FirstOrDefault(p => p.idPoucuje == idPouc && p.Vpisi.username == vpisna && (p.koncnaOcena >= 6 || p.koncnaOcenaVaj >= 6));
                if (opravljen != null)
                {
                    opozorilo += "Študent je izpit že opravil.\n";
                }

                //preverimo placilo za izpit, se pravi pavzer ali 4. polaganje oz ce ponavlja , se zacne na novo
                //ali je otrocad pavzirano

                Vpisi obstaja = db.Vpisis.FirstOrDefault(v => v.username == vpisna && trenutnoStudLeto == v.letoVpisa.Year);
                if (obstaja == null)//pavzer
                {
                    placat = true;
                }
                else
                {
                    int steviloPr = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa == idVpis).Count();
                    if (steviloPr >= 3)
                    {
                        placat = true;
                    }
                }
                if (placat)
                {
                    opozorilo += "Izpit bo potrebno plačati. Po izpitnem roku bo poslana položnica za plačilo izpita na študentov naslov.\n";
                }

                //
                ///////////////////////////////////////////////////////////////////////////////////////
                if (opozorilo.Length > 0)
                {
                    return opozorilo;
                }
                opozorilo = "false";
            return opozorilo;
        }

        public string getSession()
        {
            return (Session["tempc"] != null) ? Session["tempc"].ToString() : "prazen";
        }





        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult PrijavaStud(FormCollection form)
        {
            Session["tempb"] = form["predmeti"];

            string[] id = form["roki"].Split(new char[] { ',' });
            decimal idPouc = Decimal.Parse(id[0]);
            DateTime datum = DateTime.FromBinary(long.Parse(id[1]));

            decimal idVpis = Decimal.Parse(form["vpisi"]);

            PrijaveNaIzpit prijava = new PrijaveNaIzpit();

            try
            {
                prijava.datumRoka = datum;
                prijava.idPoucuje = idPouc;
                prijava.idVpisa = idVpis;

                /////////////////////////////////////////////////////////////////////////////////////////////////
                DateTime dons = DateTime.Now;

                int trenutnoStudLeto = (dons.Month >= 10) ? dons.Year : (dons.Year - 1);
                DateTime zacStudLeta = new DateTime(trenutnoStudLeto, 10, 1);
                DateTime konStudLeta = new DateTime(trenutnoStudLeto + 1, 9, 30);
                int steviloPrijavTek = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa == idVpis && (p.datumRoka >= zacStudLeta && p.datumRoka <= konStudLeta)).Count();
                string skupno = "";
                Vpisi vpis = db.Vpisis.FirstOrDefault(v => v.idVpisa == idVpis);
                int sk = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa == vpis.idVpisa).Count();
                int pr = 0;
                skupno = "" + (sk+1);
                if (vpis.idVrstaVpisa.CompareTo("V2") == 0)//ce je ponavljalec
                {
                    //najdemo prvic v letniku
                    Vpisi prvic = db.Vpisis.FirstOrDefault(v => v.username == vpis.username && v.sSmer == vpis.sSmer && v.idLetnikStudija == vpis.idLetnikStudija && v.idVrstaVpisa == "V1");
                    pr = db.PrijaveNaIzpits.Where(p => p.idPoucuje == idPouc && p.idVpisa == prvic.idVpisa).Count();
                    skupno = "" + (sk + pr + 1) + " - " + pr;
                }
                int skupnoStLetu = steviloPrijavTek + 1;
                ////////////////////////////////////////////////////////////////////////////////////////



                db.AddToPrijaveNaIzpits(prijava);
                db.SaveChanges();
                ViewData["uspeh"] = true;
                string sporocilce = "Študent je uspešno prijavljen na izpitni rok predmeta <b>" + prijava.IzpitniRoki.Poucuje.sPredmeti.imePredmeta + "</b>, dne <b>" + String.Format("{0:dd/MM/yyyy}", prijava.datumRoka) + "</b>.</br>Skupno število polaganj: " + skupno + "</br>Število polaganj v tem študijskem letu: " + skupnoStLetu + "</br></br><a href='../OdjavaIzpitaReferentka/Roki/" + form["vpisna"] + "'>Pregled prijav.</a>";
                ViewData["sporocilo"] = sporocilce;
                return View("Rezultat");
            }
            catch (Exception e)
            {
                ViewData["uspeh"] = false;
                ViewData["sporocilo"] = "Študent se je neuspešno prijavil na izpit. Je že prijavljen na ta izpit.";
                return View("Rezultat");
            }
        }


    }
}
